#ifndef OMG_DDS_POLICY_FWD_HPP_
#define OMG_DDS_POLICY_FWD_HPP_

/* Copyright (c) 2009-2010, Real-Time Innovations, Inc.
 * Copyright (c) 2010, Object Management Group, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - Neither the names of the above copyright holders nor the names of their
 *   contributors may be used to endorse or promote products derived from
 *   this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL A COPYRIGHT HOLDER OR CONTRIBUTOR BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */


class OMG_DDS_DEADLINE_QOS_POLICY_DELEGATE;
class OMG_DDS_DESTINATION_ORDER_QOS_POLICY_DELEGATE;
class OMG_DDS_DURABILITY_QOS_POLICY_DELEGATE;
class OMG_DDS_ENTITY_FACTORY_QOS_POLICY_DELEGATE;
class OMG_DDS_GROUP_DATA_QOS_POLICY_DELEGATE;
class OMG_DDS_HISTORY_QOS_POLICY_DELEGATE;
class OMG_DDS_LATENCY_BUDGET_QOS_POLICY_DELEGATE;
class OMG_DDS_LIFESPAN_QOS_POLICY_DELEGATE;
class OMG_DDS_LIVELINESS_QOS_POLICY_DELEGATE;
class OMG_DDS_OWNERSHIP_QOS_POLICY_DELEGATE;
class OMG_DDS_PARTITION_QOS_POLICY_DELEGATE;
class OMG_DDS_PRESENTATION_QOS_POLICY_DELEGATE;
class OMG_DDS_READER_DATA_LIFECYCLE_QOS_POLICY_DELEGATE;
class OMG_DDS_RELIABILITY_QOS_POLICY_DELEGATE;
class OMG_DDS_RESOURCE_LIMITS_QOS_POLICY_DELEGATE;
class OMG_DDS_TIME_BASED_FILTER_QOS_POLICY_DELEGATE;
class OMG_DDS_TOPIC_DATA_QOS_POLICY_DELEGATE;
class OMG_DDS_TRANSPORT_PRIORITY_QOS_POLICY_DELEGATE;
class OMG_DDS_USER_DATA_QOS_POLICY_DELEGATE;
class OMG_DDS_WRITER_DATA_LIFECYCLE_QOS_POLICY_DELEGATE;

#ifdef OMG_DDS_OWNERSHIP_SUPPORT
class OMG_DDS_OWNERSHIP_STRENGTH_QOS_POLICY_DELEGATE;
#endif  // OMG_DDS_OWNERSHIP_SUPPORT

#ifdef OMG_DDS_PERSISTENCE_SUPPORT
class OMG_DDS_DURABILITY_SERVICE_QOS_POLICY_DELEGATE;
#endif  // OMG_DDS_PERSISTENCE_SUPPORT

#ifdef OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT
class OMG_DDS_DATA_REPRESENTATION_QOS_POLICY_DELEGATE;
class OMG_DDS_TYPE_CONSISTENCY_ENFORCEMENT_QOS_POLICY_DELEGATE;
#endif  // defined(OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT)


namespace dds {
    namespace core {
        namespace policy {
            // --- Data representation QoS policy: --- //
#ifdef OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT
            typedef short DataRepresentationId;

            const DataRepresentationId XCDR_DATA_REPRESENTATION = 0;
            const DataRepresentationId XML_DATA_REPRESENTATION  = 1;

            typedef std::vector<DataRepresentationId>
            DataRepresentationIdSeq;

            typedef tdds::core::policy::DataRepresentation<OMG_DDS_DATA_REPRESENTATION_QOS_POLICY_DELEGATE>
            DataRepresentation;
#endif  // defined(OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT)

            // --- Deadline QoS policy: --- //
            typedef tdds::core::policy::Deadline<OMG_DDS_DEADLINE_QOS_POLICY_DELEGATE>
            Deadline;

            // --- Destination order QoS policy: --- //
            typedef tdds::core::policy::DestinationOrder<OMG_DDS_DESTINATION_ORDER_QOS_POLICY_DELEGATE>
            DestinationOrder;

            // --- Durability QoS policy: --- //
            typedef tdds::core::policy::Durability<OMG_DDS_DURABILITY_QOS_POLICY_DELEGATE>
            Durability;

            // --- Durability service QoS policy: --- //
#ifdef OMG_DDS_PERSISTENCE_SUPPORT
            typedef tdds::core::policy::DurabilityService<OMG_DDS_DURABILITY_SERVICE_QOS_POLICY_DELEGATE>
            DurabilityService;
#endif  // OMG_DDS_PERSISTENCE_SUPPORT

            // --- Entity factory QoS policy: --- //
            typedef tdds::core::policy::EntityFactory<OMG_DDS_ENTITY_FACTORY_QOS_POLICY_DELEGATE>
            EntityFactory;

            // --- Group data QoS policy: --- //
            typedef tdds::core::policy::GroupData<OMG_DDS_GROUP_DATA_QOS_POLICY_DELEGATE>
            GroupData;

            // --- History QoS policy: --- //
            typedef tdds::core::policy::History<OMG_DDS_HISTORY_QOS_POLICY_DELEGATE>
            History;

            // --- Latency budget QoS policy: --- //
            typedef tdds::core::policy::LatencyBudget<OMG_DDS_LATENCY_BUDGET_QOS_POLICY_DELEGATE>
            LatencyBudget;

            // --- Lifespan QoS policy: --- //
            typedef tdds::core::policy::Lifespan<OMG_DDS_LIFESPAN_QOS_POLICY_DELEGATE>
            Lifespan;

            // --- Liveliness QoS policy: --- //
            typedef tdds::core::policy::Liveliness<OMG_DDS_LIVELINESS_QOS_POLICY_DELEGATE>
            Liveliness;

            // --- Ownership QoS policy: --- //
            typedef tdds::core::policy::Ownership<OMG_DDS_OWNERSHIP_QOS_POLICY_DELEGATE>
            Ownership;

            // --- Ownership strength QoS policy: --- //
#ifdef OMG_DDS_OWNERSHIP_SUPPORT
            typedef tdds::core::policy::OwnershipStrength<OMG_DDS_OWNERSHIP_STRENGTH_QOS_POLICY_DELEGATE>
            OwnershipStrength;
#endif  // OMG_DDS_OWNERSHIP_SUPPORT

            // --- Partition QoS policy: --- //
            typedef tdds::core::policy::Partition<OMG_DDS_PARTITION_QOS_POLICY_DELEGATE>
            Partition;

            // --- Presentation QoS policy: --- //
            typedef tdds::core::policy::Presentation<OMG_DDS_PRESENTATION_QOS_POLICY_DELEGATE>
            Presentation;

            // --- QoS policy: --- //
            class OMG_DDS_API QosPolicy;

            // --- QoS policy ID: --- //
            typedef uint32_t QosPolicyId;
            
            // --- Reader data lifecycle QoS policy: --- //
            typedef tdds::core::policy::ReaderDataLifecycle<OMG_DDS_READER_DATA_LIFECYCLE_QOS_POLICY_DELEGATE>
            ReaderDataLifecycle;

            // --- Reliability QoS policy: --- //
            typedef tdds::core::policy::Reliability<OMG_DDS_RELIABILITY_QOS_POLICY_DELEGATE>
            Reliability;

            // --- Resource limits QoS policy: --- //
            typedef tdds::core::policy::ResourceLimits<OMG_DDS_RESOURCE_LIMITS_QOS_POLICY_DELEGATE>
            ResourceLimits;

            // --- Time-based filter QoS policy: --- //
            typedef tdds::core::policy::TimeBasedFilter<OMG_DDS_TIME_BASED_FILTER_QOS_POLICY_DELEGATE>
            TimeBasedFilter;

            // --- Topic data QoS policy: --- //
            typedef tdds::core::policy::TopicData<OMG_DDS_TOPIC_DATA_QOS_POLICY_DELEGATE>
            TopicData;

            // --- Transport priority QoS policy: --- //
            typedef tdds::core::policy::TransportPriority<OMG_DDS_TRANSPORT_PRIORITY_QOS_POLICY_DELEGATE>
            TransportPriority;

            // --- Type consistency enforcement QoS policy: --- //
#ifdef OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT
            typedef tdds::core::policy::TypeConsistencyEnforcement<OMG_DDS_TYPE_CONSISTENCY_ENFORCEMENT_QOS_POLICY_DELEGATE>
            TypeConsistencyEnforcement;
#endif  // defined(OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT)

            // --- User data QoS policy: --- //
            typedef tdds::core::policy::UserData<OMG_DDS_USER_DATA_QOS_POLICY_DELEGATE>
            UserData;

            // --- Writer data lifecycle QoS policy: --- //
            typedef tdds::core::policy::WriterDataLifecycle<OMG_DDS_WRITER_DATA_LIFECYCLE_QOS_POLICY_DELEGATE>
            WriterDataLifecycle;
        }
    }
}


#endif // !defined(OMG_DDS_POLICY_FWD_HPP_)
